#define SQLITE_ENABLE_FTS5 1 // 启用SQLite的FTS5（全文搜索模块）
#include <head.h>
#include "Sqlite.h"

int found = 0;

// 初始化数据库（新增 family_key 字段）
sqlite3 *Sqlite3_Init_DB()
{
    sqlite3 *db;
    // 打开或创建SQLite数据库文件
    int ret = sqlite3_open(DB_NAME, &db);
    if (ret != SQLITE_OK)
    {
        // stderr标准错误输出流 当数据库打开失败时，立即输出错误信息
        fprintf(stderr, "数据库打开错误: %s\n", sqlite3_errmsg(db)); //==printf("数据库打开错误: %s\n", sqlite3_errmsg(db));
        exit(EXIT_FAILURE);
    }

    // 创建用户表（新增 family_key 字段）
    char *sql = "CREATE TABLE IF NOT EXISTS users ("
                "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                "username TEXT UNIQUE, "
                "password TEXT, "
                "family_key TEXT);";
    char *errmsg;
    ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "创建表失败: %s\n", errmsg);
        sqlite3_close(db);
        sqlite3_free(errmsg);
        exit(EXIT_FAILURE);
    }

    return db;
}

// 注册用户（带家庭密钥）
int Sqlite3_Register_User(sqlite3 *db, const char *username, const char *password, const char *family_key)
{
    char sql[512];
    sprintf(sql, "INSERT INTO users (username, password, family_key) VALUES ('%s', '%s', '%s');",
            username, password, family_key);

    char *errmsg;
    int ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
    if (ret == SQLITE_CONSTRAINT)
    {
        fprintf(stderr, "注册失败：用户名已存在\n");
        sqlite3_free(errmsg);
        return -1;
    }
    else if (ret != SQLITE_OK)
    {
        fprintf(stderr, "注册失败：%s\n", errmsg);
        sqlite3_free(errmsg);
        return -2;
    }

    return 0;
}

// 回调函数检查结果
/**
 * SQL查询回调函数 - 检查结果是否存在
 * @param data 传递的用户数据（指向found变量）
 * @param argc 结果列数
 * @param argv 结果值数组
 * @param azColName 列名数组
 */
// typedef int (*sqlite3_callback)(
//     void*,    /* 在 sqlite3_exec() 的第 4 个参数中提供的数据 */
//     int,      当前被查找到行的 总列数
//     char**,   列值数据
//     char**    字段  表头
// );
int callback(void *data, int argc, char **argv, char **azColName)
{
    found = 1;
    return 0;
}

// 登录验证
int Sqlite3_Login_User(sqlite3 *db, const char *username, const char *password, const char *family_key)
{
    char sql[512];
    // SQL 查询中包含 family_key
    sprintf(sql, "SELECT * FROM users WHERE username = '%s' AND password = '%s' AND family_key = '%s';",
            username, password, family_key);

    char *errmsg;

    // 执行查询，结果通过callback函数处理
    int ret = sqlite3_exec(db, sql, callback, &found, &errmsg);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "查询失败：%s\n", errmsg);
        sqlite3_free(errmsg);
        return -1;
    }

    return found ? 0 : -1; // 根据found标志返回结果
}

// 根据id或者用户名从数据库中删除用户信息
int Sqlites3_Delete_User(sqlite3 *db, bool is_by_id, const char *info)
{
    char sql[1024];
    if (is_by_id)
    {
        sprintf(sql, "DELETE FROM users WHERE id = '%s';", info);
    }
    else
    {
        sprintf(sql, "DELETE FROM users WHERE username = '%s' ;", info);
    }

    char *errmsg;

    int ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "删除用户失败：%s\n", errmsg);
        sqlite3_free(errmsg);
        return -1;
    }

    // sqlite3_changes返回最后一次 INSERT、UPDATE 或 DELETE 操作影响的行数
    return (sqlite3_changes(db) > 0) ? 1 : -2; // 1=成功，-2=用户不存在
}

// 根据用户名从数据库中修改用户名和用户密码
int Sqlites3_Modify_User(sqlite3 *db, const char *old_username, const char *old_password, const char *new_username, const char *new_password, char *family_key)
{
    // 检查该用户是否存在
    char check_sql[1024];
    sprintf(check_sql, "SELECT * FROM users WHERE username = '%s' AND password = '%s' AND family_key = '%s';", old_username, old_password, family_key);
    int found = 0;
    char *errmsg;
    int ret = sqlite3_exec(db, check_sql, callback, &found, &errmsg);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "用户不存在：%s\n", errmsg);
        sqlite3_free(errmsg);
        return -1;
    }

    // 检查新用户是否已存在
    char sql[1024];
    sprintf(sql, "SELECT * FROM users WHERE username = '%s';", new_username);
    found = 0;
    sqlite3_exec(db, sql, callback, &found, &errmsg);
    if (found)
    {
        fprintf(stderr, "修改失败：新用户名已存在\n");
        return -2;
    }

    // 执行修改
    char update_sql[1024];
    sprintf(update_sql, "UPDATE users SET username = '%s', password = '%s' WHERE username = '%s';", new_username, new_password, old_username);
    ret = sqlite3_exec(db, update_sql, NULL, NULL, &errmsg);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "修改用户失败：%s\n", errmsg);
        sqlite3_free(errmsg);
        return -3;
    }

    return 0;
}

// 查询
int callback_query(void *data, int argc, char **argv, char **azColName)
{
    char *buf = (char *)data;
    if (argv[0] && argv[1] && argv[2] && argv[3])
    {
        sprintf(buf, "\nUSER_INFO|%s|%s|%s|%s\n", argv[0], argv[1], argv[2], argv[3]);
    }
    return 0;
}
// 根据id或者用户名从数据库中 查询用户信息
char *Sqlites3_Query_User(sqlite3 *db, bool is_by_id, const char *info)
{
    char sql[1024];
    if (is_by_id)
    {
        sprintf(sql, "SELECT * FROM users WHERE id = %s;", info);
    }
    else
    {
        sprintf(sql, "SELECT * FROM users WHERE username = '%s' ;", info);
    }

    // 分配结果缓冲区（需调用者释放）
    char *result = (char *)malloc(1024);
    result[0] = '\0';
    char *errmsg;

    sqlite3_exec(db, sql, callback_query, result, &errmsg);
    if (errmsg)
    {
        fprintf(stderr, "查询失败：%s\n", errmsg);
        sqlite3_free(errmsg);
        free(result);
        return NULL;
    }

    if (result[0] == '\0')
    {
        free(result);
        return strdup("USER_NOT_FOUND\n"); // 复制字符串 s 到新的内存空间，并返回指向该空间的指针
    }
    return result;
}